package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.model.product.BaseAttrInfo;
import com.atguigu.gmall.model.product.BaseAttrValue;
import com.atguigu.gmall.product.mapper.BaseAttrValueMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.atguigu.gmall.product.service.BaseAttrInfoService;
import com.atguigu.gmall.product.mapper.BaseAttrInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 *
 */
@Service
public class BaseAttrInfoServiceImpl extends ServiceImpl<BaseAttrInfoMapper, BaseAttrInfo>
    implements BaseAttrInfoService{
    @Autowired
    BaseAttrInfoMapper baseAttrInfoMapper;
    @Autowired
    BaseAttrValueMapper baseAttrValueMapper;
    @Override
    public List<BaseAttrInfo> getAttrInfoList(Long category1Id, Long category2Id, Long category3Id) {
        List<BaseAttrInfo> baseAttrInfoList=baseAttrInfoMapper.getAttrInfoList(category1Id,category2Id,category3Id);
        return baseAttrInfoList;
    }

    /**
     * 添加平台属性,要保存到两张表中,添加事务
     * @param baseAttrInfo
     */
    @Transactional
    @Override
    public void saveAttrInfoAndValue(BaseAttrInfo baseAttrInfo) {
        //保存属性名到base_attr_info
        baseAttrInfoMapper.insert(baseAttrInfo);
        //保存值到base_attr_value
        List<BaseAttrValue> attrValueList = baseAttrInfo.getAttrValueList();
        for (BaseAttrValue baseAttrValue : attrValueList) {
            //回填属性
            Long id = baseAttrInfo.getId();
            baseAttrValue.setAttrId(id);
            baseAttrValueMapper.insert(baseAttrValue);
        }


    }

    /**
     * 修改属性
     * @param baseAttrInfo
     */
    @Transactional
    @Override
    public void updateAttrInfoAndValue(BaseAttrInfo baseAttrInfo) {
        //1.修改属性
        baseAttrInfoMapper.updateById(baseAttrInfo);
        //2.3 从提交的数据中对比数据库原纪录,没提交的id删
        //删除base_attr_value表中not in (前端携带的id)
       List<Long> vids = new ArrayList<>();
        for (BaseAttrValue baseAttrValue : baseAttrInfo.getAttrValueList()) {
            if (baseAttrValue.getId() !=null){
                vids.add(baseAttrValue.getId());
            }
        }
        if (vids.size()>0){
            //有东西保留部分
            QueryWrapper<BaseAttrValue> baseAttrValueQueryWrapper = new QueryWrapper<>();
            baseAttrValueQueryWrapper.eq("attr_id",baseAttrInfo.getId());
            baseAttrValueQueryWrapper.notIn("id",vids);
            baseAttrValueMapper.delete(baseAttrValueQueryWrapper);
        }else {
            //全删
            QueryWrapper<BaseAttrValue> baseAttrValueQueryWrapper = new QueryWrapper<>();
            baseAttrValueQueryWrapper.eq("attr_id",baseAttrInfo.getId());
            baseAttrValueMapper.delete(baseAttrValueQueryWrapper);
        }

        //2.修改属性值
        List<BaseAttrValue> attrValueList = baseAttrInfo.getAttrValueList();
        for (BaseAttrValue baseAttrValue : attrValueList) {
            //2.1有id的改
            if (baseAttrValue.getId() !=null){
                baseAttrValueMapper.updateById(baseAttrValue);
            }
            // 2.2无id的属性值是新增
            if (baseAttrValue.getId() ==null){
                    baseAttrValue.setAttrId(baseAttrInfo.getId());
                    baseAttrValueMapper.insert(baseAttrValue);
            }


        }




    }

    @Override
    public List<BaseAttrValue> findAttrValueListById(Long attrId) {

        return baseAttrInfoMapper.findAttrValueListById(attrId);
    }

    /**
     * 保存或者更新
     * @param baseAttrInfo
     */
    @Override
    @Transactional
    public void saveOrUpdateAttrInfo(BaseAttrInfo baseAttrInfo) {
        Long id = baseAttrInfo.getId();
        if (id==null){
            saveAttrInfoAndValue(baseAttrInfo);
        }else {
            updateAttrInfoAndValue(baseAttrInfo);
        }
    }

    /**
     * 根据属性id查询名和值
     * @param attrId
     * @return
     *//*
    @Override
    public BaseAttrInfo getAttrValueListById(Long attrId) {

        return baseAttrInfoMapper.findAttrInfoAndValueByAttrId(attrId);
    }*/
}




